from exts import db
from datetime import datetime


class UserModel(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(200), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)
    icons = db.relationship('IconWeb', secondary='user_icon', back_populates='users')

    def __repr__(self):
        return f'<User {self.username}>'


class EmailCaptchaModel(db.Model):
    __tablename__ = 'email_captcha'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(100), nullable=False)
    captcha = db.Column(db.String(100), nullable=False)
    # 如果使用过标注一下
    used = db.Column(db.Boolean, default=False)


# class SearchWeb(db.Model):
#     __tablename__ = 'searchweb'
#     id = db.Column(db.Integer, primary_key=True, autoincrement=True)
#     username = db.Column(db.String(100), nullable=False)
#     password = db.Column(db.String(200), nullable=False)
#     email = db.Column(db.String(100), nullable=False, unique=True)
#     join_time = db.Column(db.DateTime, default=datetime.now)


class IconWeb(db.Model):
    __tablename__ = 'iconweb'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), nullable=False)  # 字符串，不超过20字符
    address = db.Column(db.String(255), nullable=False)  # 网站地址，通常URL长度不超过255字符
    tip = db.Column(db.String(200), nullable=False)  # 字符串，不超过200字符
    icon = db.Column(db.String(255), nullable=False)  # 网址或绝对地址，长度同样不超过255字符
    join_time = db.Column(db.DateTime, default=datetime.now)
    users = db.relationship('UserModel', secondary='user_icon', back_populates='icons')

    def __repr__(self):
        return f'<IconWeb {self.name}>'


# 多对多关联表模型
class UserIcon(db.Model):
    __tablename__ = 'user_icon'
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    icon_id = db.Column(db.Integer, db.ForeignKey('iconweb.id'), primary_key=True)
    user = db.relationship('UserModel', backref=db.backref('user_icons', cascade='all, delete-orphan'))
    icon = db.relationship('IconWeb', backref=db.backref('user_icons', cascade='all, delete-orphan'))

    def __repr__(self):
        return f'<UserIcon user_id={self.user_id} icon_id={self.icon_id}>'

    # 在这个代码中，UserIcon类定义了多对多关联表，包含两个外键字段user_id和icon_id，分别指向UserModel和IconWeb的主键。同时，UserIcon类使用db.relationship建立了与UserModel和IconWeb的关联，并设置了backref来方便地从用户或图标访问关联的记录。
    #
    # 现在，你可以使用UserIcon模型来添加或查询用户和图标之间的关系：
    #
    # python
    # # 添加用户和图标之间的关系
    # new_user_icon = UserIcon(user_id=1, icon_id=1)
    # db.session.add(new_user_icon)
    # db.session.commit()
    #
    # # 查询特定用户的所有图标
    # user_icons = UserModel.query.get(1).icons
    # for icon in user_icons:
    #     print(icon.name)
    #
    # # 查询特定图标的所有用户
    # icon_users = IconWeb.query.get(1).users
    # for user in icon_users:
    #     print(user.username)
    # 这种方式提供了更直观的管理和查询多对多关系的方法，同时保持了代码的清晰和组织性。
